#include "sege.h"
#include <math.h>
#include "snode.h"
SEge::SEge() 
	: QGraphicsPathItem()
{
	spoint = new SEgeControl();	
	spoint->setPos(0,0);

	epoint = new SEgeControl();
	epoint->setPos(100,50);

	dpoint = new SEgeControl();
}

qreal GetAngle(qreal dx, qreal dy)
{
	qreal rc = sqrt(dx*dx + dy*dy);
	if (fabs(rc)<=0.0001) return 0;
	qreal c = dx/rc;
	if (fabs(c)<=0.0001) c=M_PI/2;
		else c = atan(sqrt(fabs(1-c*c))/c);
	if (c-0.0001 < 0) c = M_PI + c;
	if (dy-0.0001 < 0) c = 2*M_PI - c;
	return c;
}

//Вычисляет ближайшую точку на окружности c центром Node и радиусом rad к точке d
QPointF calcPoint(QPointF Node,qreal rad,QPointF d)
{
	qreal angle = GetAngle(d.x() - Node.x(), d.y() - Node.y());
	return(QPointF(Node.x()+rad*cosf(angle),Node.y()+rad*sinf(angle)));
}

void SEge::updateControls() 
{
	spoint->setPos(calcPoint(from->scenePos(),from->rect().height()/2,dpoint->scenePos() - scenePos()));
	epoint->setPos(calcPoint(to->scenePos(),to->rect().height()/2,dpoint->scenePos() - scenePos()));
	
	QPainterPath egePath;
	
	egePath.moveTo(mapFromScene(spoint->scenePos()));
	egePath.quadTo(mapFromScene(dpoint->scenePos()),
					mapFromScene(epoint->scenePos()));

	setPath(egePath);
}

void SEge::showControls()
{
	//setNormal();
	spoint->setParentItem(this);
	dpoint->setParentItem(this);
	epoint->setParentItem(this);
	//ребро прямое, контрол в центре линии соединения
	dpoint->setPos((from->x()+to->x())/2,(from->y()+to->y())/2);
}

void SEge::setNormal()
{
	dpoint->setPos((from->x()+to->x())/2,(from->y()+to->y())/2);
}

